/**
 * Copyright 2009 - ChunMap
 * 
 * 这个文件是ChunMap项目的一部分。
 * ChunMap是开源软件。
 * 你可以自由复制、传播本项目的下载包文件，但必须保持其完整性。
 * 我们不用对使用中的风险及由此造成的损失承担任何责任。
 * 详细情况请见《ChunMap许可协议》。

 * 想了解更多有关ChunMap的信息，请访问http://code.google.com/p/chunmap/
 */
package chunmap.orm.sql.maker;

import java.util.ArrayList;
import java.util.List;

import chunmap.orm.mapping.Table;
import chunmap.orm.mapping.column.Column;
import chunmap.orm.mapping.column.Pk;
import chunmap.orm.sql.Sql;
import chunmap.orm.sql.SqlParameter;
import chunmap.util.Function;
import chunmap.util.Result;

/**
 * @author yangjiandong
 *
 */
public class UpdateMaker {
	public static Sql getUpdateSql(Table table,final Object obj,Function filter){
		final StringBuilder s = new StringBuilder();
		
		final List<SqlParameter> sqlParameters=new ArrayList<SqlParameter>();
		s.append(getUpdateString(table,obj,sqlParameters,filter));
		
		Sql sql=UtilsMaker.buildSqlByFindId(s, table, obj
				, Sql.UpdateExecute,sqlParameters.size()+1);
		sql.addAllSqlParameters(sqlParameters);
		return sql;
	}
	
	public static String getUpdateString(Table table,final Object obj
			,final List<SqlParameter> sqlParameters,final Function filter){
		final StringBuilder s = new StringBuilder();
		s.append("update "+table.getName()+" set ");
		
		final Result r=new Result(0);
		
		table.each(new Function(){
			@Override
			public Object call(Object... args) {
				Column c=(Column)args[0];
				
				if(c instanceof Pk)return null;
				if(filter!=null){
					boolean pass=(Boolean)filter.call(c);
					if(!pass)return null;
				}
				
				Object value=c.getValue(obj);
				s.append(c.getDbName() + "=?,");
				
				int i=(Integer)r.getValue();
				SqlParameter p=new SqlParameter(c.getDataType(),value,i+1);
				sqlParameters.add(p);
				
				r.setValue(++i);
				return null;
			}});
		s.deleteCharAt(s.length() - 1);
		return s.toString();
	}
}
